package code

import (
	"errors"

	pkgErr "github.com/lab-online/pkg/errors"
	"github.com/lab-online/pkg/util"
)

// ParseErrorCode 解析错误码
func ParseErrorCode(e error) int {
	var restErr *pkgErr.RESTError
	if errors.As(e, &restErr) {
		return restErr.Code
	}

	var dbErr *pkgErr.DatabaseError
	if errors.As(e, &dbErr) {
		return dbErr.Code
	}

	return 0
}

// IsSimilar 错误码是否相同, 任意一个错误 RESTError 或 DatabaseError 返回 0, 相同返回错误码，否则返回 0
func IsSimilar(err1 error, err2 error) int {
	code1 := ParseErrorCode(err1)
	if code1 == 0 {
		return 0
	}
	code2 := ParseErrorCode(err2)
	return util.ConditionalPicker(code2 != 0 && code1 == code2, code1, 0)
}

// IsEqual 错误码是否相等
func IsEqual(e error, code int) bool {
	return ParseErrorCode(e) == code
}

// ErrorPicker 错误码匹配则返回 target，否则返回 source
func ErrorPicker(source error, code int, target error) error {
	return util.ConditionalPicker(IsEqual(source, code), target, source)
}
